
package com.pactera.common.redis;

import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * 类名称：AbRedisConfiguration 
 * 类描述： Redis 抽象配置类
 * 创建人：lee 
 * 创建时间：2017年12月18日 下午1:42:23
 * @version 1.0.0
 */
@SuppressWarnings("unchecked")
public abstract class AbRedisConfiguration {

	private Logger logger = LogManager.getLogger(getClass());
	
	protected RedisTemplate<String,Object> template;
	
	
	public RedisTemplate<String,Object> getTemple() {
		return template;
	}
	
	/**
	 * 方法描述：检查是否存在key
	 * @param key data-key
	 * @return boolean 是否存在
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午3:06:41
	 */
	public boolean exists(final String key) {
		return getTemple().hasKey(key);
	}

	
	/**
	 * 方法描述：写入缓存
	 * @param key data-键
	 * @param value data-值
	 * @return boolean 是否成功
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午2:54:58
	 */
	public boolean set(final String key, Object value) {
		boolean result = false;
		try {
			 getTemple().opsForValue().set(key, value);
			 result = true;
		} catch (Exception e) {
			logger.error("Redis set data exception：",e);
		}
		return result;
	}
	
	
	/**
	 * 方法描述： 写入缓存(时效)
	 * @param key data-键
	 * @param value data-值
	 * @param expireTime 时效
	 * @return boolean 是否成功
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午2:53:45
	 */
	public boolean set(final String key, Object value, Long expireTime) {
		boolean result = false;
		try {
			getTemple().opsForValue().set(key, value);
			getTemple().expire(key, expireTime, TimeUnit.SECONDS);
			result = true;
		} catch (Exception e) {
			logger.error("Redis set expire data exception：",e);
		}
		return result;
	}

	

	/**
	 * 方法描述：读取缓存
	 * @param key data-键
	 * @return Object data-值
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午2:56:03
	 */
	public Object get(final String key) {
		Object result = null;

		try {
			result = getTemple().opsForValue().get(key);
		} catch (Exception e) {
			logger.error("Redis get data exception：",e);
		}
		return result;
	}
	
	
	/**
	 * 方法描述：删除key对应的value
	 * @param key data-键
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午2:58:05
	 */
	public void remove(final String key) {
		if (exists(key)) {
			getTemple().delete(key);
		}
	}
	
	/**
	 * 方法描述：批量删除keys对应的value
	 * @param keys 多个key
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午2:59:10
	 */
	public void remove(final String... keys) {
		for (String key : keys) {
			remove(key);
		}
	}
	
	/**
	 * 方法描述：根据过滤规则删除key
	 * @param pattern 过滤规则
	 * 创建人：lee
	 * 创建时间：2017年12月19日 下午3:03:20
	 */
	public void removePattern(final String pattern) {
		Set<String> keys = getTemple().keys(pattern);
		if (keys.size() > 0){
			getTemple().delete(keys);
		}
	}
}
